package conf

import (
	"flag"
	"github.com/gin-gonic/gin"
	"gopkg.in/yaml.v3"
	"os"
)

type ServerConfig struct {
	Port string `yaml:"port"` // Port 项目端口
}

// DBConfig 数据库配置
type DBConfig struct {
	Device   string `yaml:"device"` // Device 驱动，默认mysql
	Ip       string `yaml:"ip"`
	Port     string `yaml:"port"`
	Username string `yaml:"username"`
	Password string `yaml:"password"`
	Table    string `yaml:"table"`
}

type CacheConfig struct {
	LoginUserKey      string `yaml:"user_key"`            // LoginUserKey 存储登录用户的key
	GotoUri           string `yaml:"goto_uri"`            // GotoUri 跳转的uri，存储的key
	CookieName        string `yaml:"cookie_name"`         // CookieName session的名称，本意是cookie
	CookieExpiresHour int64  `yaml:"cookie_expires_hour"` // CookieExpiresHour cookie过期时间，和session同步，以小时为单位
}

type UserConfig struct {
	UserTableScope string `yaml:"user_table_scope"` // UserTableScope 用户表，用于oauth系统查询用户是否匹配scope
	UserTableField string `yaml:"user_table_field"` // UserTableField 用于标记用户表字段
	UserAppCount   int    `yaml:"user_app_count"`   // UserAppCount 用户最多申请app数量
}

type ImgConfig struct {
	ImgLocalUrl    string `yaml:"img_local_url"`    // ImgLocalUrl 图片本地位置
	ImgNginxServer string `yaml:"img_nginx_server"` // ImgNginxServer 图片nginx服务器位置
}

type WebPathConfig struct {
	WebAssetsPath string `yaml:"web_assets_path"` // WebAssetsPath web的静态资源目录
	WebRootPath   string `yaml:"web_root_path"`   // WebRootPath Web的index目录
}

type JwtConfig struct {
	RsaPublic  string `yaml:"rsa_public"`  // RsaPublic jwt，rsa加密公钥
	RsaPrivate string `yaml:"rsa_private"` // RsaPrivate jwt，rsa加密私钥
}

type Config struct {
	Server *ServerConfig  `yaml:"server"`
	Db     *DBConfig      `yaml:"database"`
	Cache  *CacheConfig   `yaml:"cache"`
	User   *UserConfig    `yaml:"user_login"`
	Img    *ImgConfig     `yaml:"img"`
	Web    *WebPathConfig `yaml:"web_path"`
	Jwt    *JwtConfig     `yaml:"jwt"`
}

var Conf *Config

// InitConf 初始化配置文件
func init() {
	// 开发，部署模式切换
	var mode string
	// 参数值指针，参数名称，默认值，备注
	flag.StringVar(&mode, "type", "dev", "开发模式")
	// 解析运行时参数
	flag.Parse()

	// 开发模式配置文件初始化
	switch mode {
	case "dev":
		dev()
	case "prod":
		prod()
	default:
		dev()
	}
}

// 就是使用默认值
func dev() {
	gin.SetMode(gin.DebugMode)
	// 解析配置文件
	readConfig("./internal/conf/config_dev.yaml")
}

// 部署模式，只改需要改的
func prod() {
	gin.SetMode(gin.ReleaseMode)
	// 解析配置文件
	readConfig("./internal/conf/config_prod.yaml")
}

// 读取配置文件，使用的gopkg.in/yaml.v3
func readConfig(fName string) {
	file, err := os.Open(fName)
	if err != nil {
		panic("读取配置文件失败，" + err.Error())
	}
	defer file.Close()

	// 创建解析器
	decoder := yaml.NewDecoder(file)
	// 解析，并给指定配置集合结构体
	err = decoder.Decode(&Conf)
	if err != nil {
		panic("配置文件解析失败，" + err.Error())
	}
}
